﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Schedule.Support.Forms
{
	public static class PicLibrary22
	{
		#region Image Arrowdowndouble3
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku arrow-down-double-3.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu Arrowdowndouble3_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property Arrowdowndouble3, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property Arrowdowndouble3_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-down-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowdowndouble3_Cached
		{
			get
			{
				if (_Arrowdowndouble3 == null) _Arrowdowndouble3 = Arrowdowndouble3;
				return _Arrowdowndouble3;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku arrow-down-double-3.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image Arrowdowndouble3_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Arrowdowndouble3_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Arrowdowndouble3_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-down-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowdowndouble3 { get { return _ImageCreateFrom(_Arrowdowndouble3_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru arrow-down-double-3.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Arrowdowndouble3_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Arrowdowndouble3_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-down-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowdowndouble3_FromFile { get { return _ImageCreateFrom(_Arrowdowndouble3_string, "arrow-down-double-3.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru Arrowdowndouble3
		/// </summary>
		/// <returns></returns>
		private static string _Arrowdowndouble3_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(1844);
			sb.Append("iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAJhAAACYQHBMFX6AAAACXZwQWcAAAAWAAAAFgDcxelYAAAD");
			sb.Append("RElEQVQ4y9WVPWwcVRDHf+/jvnw29tmOhRGGCiQXbqADKaWDoLARRaAChIQiQ/iQaGgwNUUISDRRREER0UTIWFiWZQIRkBQpoHSEApG5YBvf7XnvvHf7PRR7ceL4HNyk");
			sb.Append("YFejN1vM783+Z+Y9JSI8iEc/ECpgbzvqeXWSiNfR3e1Ud9Wo7Fuprq/uednzjqmLcjb5HEDdluLERye2ph6bGuvEHfzUJ5CAUIWZ6ZAbO3+w7q1jigZtNVobDAaNxiSG");
			sb.Append("IiV2K16n9uZm376MV35d+dBre+ePP3NcRc0I3/NxPIe6X8eJHHzx8dMOxN2/ka6FgA8UDHjq3AEpZFG+VDPqqdFjo2+NT4xjYoNJDVZbbGzRaEiBElAAzB3wWO5htsP6");
			sb.Append("5fSd8L3exfuW04tXFi+7LVds3mIKBlM0mJJB9SnoBwaAQWAos8HhIXGj3b+kET13aFeIiKQ6nV26snQrJRVbsNiCxRYtuqizbMtd+BCUKiVJdqUdbIXTMi/+3ay94hVe");
			sb.Append("Kiz35fumEkkQI6XxifHK5NQkjbhBPa3T1E2qqpplOwC23/Lorcfx6l7HYn2DUa7fqjbfrk/t03hscKw8d3LuEf2Qxmk5OG0Hx3cw0tXZ2ExjA+QgLsbcnLwBNUrUKI24");
			sb.Append("owwktnVAiup6dfbMV2c2Ai8QYwxGG/ZWlbUWKZCQdYYP7AIRlNOyxM20/ffmzvQBsKxKvdaozVz45kJgsXI30GDISQ4iIADaQBPYAetZKWyXU7fuviHzwVrv4i3JtevV");
			sb.Append("66cv/XiJvM5jsRgxmMRgEwsdwLsDpQGVrVHlbDpn5eP4654jvQdfkPNqRj1dGa6cGpkYwYrNoCnYtiVO42woDFTSYWobte9lPvrgXk7vQ2iBueWfln/e2d4Rm2QDonxF");
			sb.Append("rpPby7bc6hfvn85NceIXeiF6ggWRuBG/uPrL6kbohWIigwkMtAAX8rv5NHHFC+udaflMgiODAeQHqXktb/bqb1cDFSoxgSF1U3RLSy4ppP62/5p8Kr8fFn/f81gW5Jrj");
			sb.Append("OO+u/bmGDS1JI6GUKyvP9T6RL+KL3DdY5D+Nl/W5J95/Usqv9Aun1HdHiVFHuZoUSqlX9YrJmUpcjp49TNd9Mf+7O+9fjXrFbJcHsLgAAAAldEVYdGNyZWF0ZS1kYXRl");
			sb.Append("ADIwMDktMTEtMTVUMTc6MDM6MDUtMDc6MDBx3el7AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAyLTIwVDIzOjI2OjE1LTA3OjAwBjtcgQAAACV0RVh0ZGF0ZTptb2Rp");
			sb.Append("ZnkAMjAxMC0wMS0xMVQwOToyNTozNy0wNzowMMx+p10AAABndEVYdExpY2Vuc2UAaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyBv");
			sb.Append("ciBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9MR1BMLzIuMS9bjzxjAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTAzLTE5VDEwOjUyOjQ0LTA2OjAw");
			sb.Append("4frSPwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAATdEVYdFNvdXJjZQBPeHlnZW4gSWNvbnPsGK7oAAAAJ3RFWHRTb3VyY2VfVVJMAGh0dHA6");
			sb.Append("Ly93d3cub3h5Z2VuLWljb25zLm9yZy/vN6rLAAAAAElFTkSuQmCC");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property Arrowdowndouble3_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void Arrowdowndouble3_Reset()
		{
			_Arrowdowndouble3 = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití Arrowdowndouble3_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _Arrowdowndouble3 = null;
		#endregion
		#region Image Arrowupdouble3
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku arrow-up-double-3.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu Arrowupdouble3_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property Arrowupdouble3, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property Arrowupdouble3_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-up-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowupdouble3_Cached
		{
			get
			{
				if (_Arrowupdouble3 == null) _Arrowupdouble3 = Arrowupdouble3;
				return _Arrowupdouble3;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku arrow-up-double-3.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image Arrowupdouble3_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Arrowupdouble3_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Arrowupdouble3_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-up-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowupdouble3 { get { return _ImageCreateFrom(_Arrowupdouble3_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru arrow-up-double-3.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Arrowupdouble3_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Arrowupdouble3_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\22\arrow-up-double-3.png
		/// </remarks>
		public static System.Drawing.Image Arrowupdouble3_FromFile { get { return _ImageCreateFrom(_Arrowupdouble3_string, "arrow-up-double-3.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru Arrowupdouble3
		/// </summary>
		/// <returns></returns>
		private static string _Arrowupdouble3_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(1784);
			sb.Append("iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAJhAAACYQHBMFX6AAAACXZwQWcAAAAWAAAAFgDcxelYAAAD");
			sb.Append("FUlEQVQ4y7XVz2scZRgH8O/3fd+d2dnZ3dkdN4Yl8cchNWmwJy1YNiXY7qENxFAUbHMJaFFqD7WXXrwY0JtgSkHwIHj1UK0FoeTg/yBevBgkov2BbrNJNrP77vvO62G2");
			sb.Append("MbZNiZq8w8M8A/N+eOaZhxk653AQSxyICkDt5SaC5IJYljlZNWG/4a663v5UfE58PlYca/p/+i9B8+t9aQXf4Dsjcf18HFbR2+witMUZXpQf/y+YczwaV+KrE6MTMDkD");
			sb.Append("GUskGx0XhuEVXlSv/yeYr7IWFsMbx44c853naPMWoiKQllL2uz2Rr+W/5GUe+lcwQapIfdN8pVn3Qo/Ws7C+BUoAIkCHWkjF0KsGy7xEf+8Vz+GzU1OnpipDFRphYJSB");
			sb.Append("Cxz6YR+IAFSATn6TYRQ8z1h9tyeYczzfONJ4d2x8DJYWRmYwfMAUDFDOYFSB+0ELtadrJ7mY++SJMGd4dHxk/NqJ6RPQTsPAwAoLqyyMZ4AQWTt24uU/XDwUv88P1dnH");
			sb.Append("wmzyqVq19u38mXnf0NA6CwsLSwsrLPqyDwTI8B2wKRv2qh0RxdEXXPQnHoFVSV2/8OaFul/0aVMLm1pYNwhmgRwAH0BhB14EOl6HssxCUMnf2vYeJMcnj4ub39+8t3Jn");
			sb.Append("xTjpgvqz9erhFw/DOgvjDIwzWRky26UChdFfnkPnbidRUF0lFA8Ne3q7Aw9/3XiGlagc/Xi6eXpkw22wZVpouRbW5Tpui9vZVJSylgQInPzB29pcTV52H/V+2v3lkRSp");
			sb.Append("uDEzNTMihKDpGzyIVKeABpAA6ABoA0k7oRxmwR/2lrnI/O7j9hquzU7NTkfliEYb2L6F1Ra2a+ES9ze6AWANwH2g3V5jVCo+w2ru1mNhzvKtxnjjvckXJjNMW9iehUkM");
			sb.Append("zJZBmqTA5gBtD+C1LL939w7cVjrNT3NLj/Q4Phf/unByYVSnGt20ix570NDQUkMLjZ/XV7CarEL6EiInIKSEhIRwAtJIhCygG24lv739e+EfU1FQhQ+Wvlqahxg8Bwdn");
			sb.Append("AWbX5CDnQwe2syFe33Uq9msd2D/vLxJ8N7uPc1/CAAAAJXRFWHRjcmVhdGUtZGF0ZQAyMDA5LTExLTE1VDE3OjAzOjA1LTA3OjAwcd3pewAAACV0RVh0ZGF0ZTpjcmVh");
			sb.Append("dGUAMjAxMC0wMi0yMFQyMzoyNjoxNS0wNzowMAY7XIEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTAtMDEtMTFUMDk6MjU6NDEtMDc6MDCla5t+AAAAZ3RFWHRMaWNlbnNl");
			sb.Append("AGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8gb3IgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvTEdQTC8yLjEv");
			sb.Append("W488YwAAACV0RVh0bW9kaWZ5LWRhdGUAMjAwOS0wMy0xOVQxMDo1Mjo0NC0wNjowMOH60j8AAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAE3RF");
			sb.Append("WHRTb3VyY2UAT3h5Z2VuIEljb25z7Biu6AAAACd0RVh0U291cmNlX1VSTABodHRwOi8vd3d3Lm94eWdlbi1pY29ucy5vcmcv7zeqywAAAABJRU5ErkJggg==");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property Arrowupdouble3_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void Arrowupdouble3_Reset()
		{
			_Arrowupdouble3 = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití Arrowupdouble3_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _Arrowupdouble3 = null;
		#endregion
		#region SPOLEČNÉ METODY PRO KONVERZI
		/// <summary>
		/// Vrátí Image z definice (string). Image generuje buď v paměti, anebo s pomocí souboru.
		/// Pokud není zadán parametr (cacheFileName) (když je null), generuje se Image v paměti.
		/// Pokud je soubor (cacheFileName) definován, pak se Image čte z něj.
		/// Pokud soubor neexistuje, nejprve se vytvoří.
		/// Umístění souboru (adresář) je dán property _ImageCacheDir, defaultně je to adresář (Sys:\Documents and Settings\All Users\Data aplikací\IconCache).
		/// Obsah obrázku definuje metoda getDataMethod.
		/// </summary>
		/// <param name="getDataMethod"></param>
		/// <param name="cacheFileName"></param>
		/// <returns></returns>
		private static System.Drawing.Image _ImageCreateFrom(_GetStringDelegate getDataMethod, string cacheFileName)
		{
			System.Drawing.Image image;
			if (cacheFileName == null)
			{
				using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(getDataMethod())))
				{
					image = System.Drawing.Image.FromStream(ms);
				}
				return image;
			}
			string fileName = System.IO.Path.Combine(_ImageCacheDir, cacheFileName);
			if (!System.IO.File.Exists(fileName))
				System.IO.File.WriteAllBytes(fileName, Convert.FromBase64String(getDataMethod()));
			if (System.IO.File.Exists(fileName))
				return Image.FromFile(fileName);
			return null;
		}
		/// <summary>
		/// Obsahuje jméno adresáře, který slouží jako Cache pro obrázky systému.
		/// </summary>
		private static string _ImageCacheDir
		{
			get
			{
				string dirName = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), "IconCacheSupport22");
				if (!System.IO.Directory.Exists(dirName))
					System.IO.Directory.CreateDirectory(dirName);
				return dirName;
			}
		}
		/// <summary>
		/// Předpis pro metody, které generují obsah souboru s daty
		/// </summary>
		/// <returns></returns>
		private delegate string _GetStringDelegate();
		/// <summary>
		/// Vrátí Icon z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Icon vytvořená z dat</returns>
		public static System.Drawing.Icon ConvertStringToIcon(string data)
		{
			System.Drawing.Icon icon;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				icon = new System.Drawing.Icon(ms);
			}
			return icon;
		}
		/// <summary>
		/// Vrátí Cursor z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Cursor vytvořený z dat</returns>
		public static System.Windows.Forms.Cursor ConvertStringToCursor(string data)
		{
			System.Windows.Forms.Cursor cursor;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				cursor = new System.Windows.Forms.Cursor(ms);
			}
			return cursor;
		}
		#endregion
	}
}
